#include<bits/stdc++.h>
using namespace std;
const int MAXN=4e4+10,INF=0x3f3f3f3f;
int n,k,ans,root,head[MAXN],cnt,f[MAXN],d[MAXN],dep[MAXN],sumch[MAXN],sum,tot;
bool vis[MAXN];
struct edge
{
	int v,next,val;
}e[MAXN*2];
void addedge(int x,int y,int z)
{
	e[++cnt]=(edge){y,head[x],z};
	head[x]=cnt;
	return;
}
void getroot(int u,int fa)
{
	sumch[u]=1;
	f[u]=0;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa||vis[v])continue;
		getroot(v,u);
		sumch[u]+=sumch[v];
		f[u]=max(f[u],sumch[v]);
	}
	f[u]=max(f[u],sum-sumch[u]);
	if(f[u]<f[root])root=u;
	return;
}
void getdep(int u,int fa)
{
	dep[++tot]=d[u];
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa||vis[v])continue;
		d[v]=d[u]+e[i].val;
		getdep(v,u);
	}
	return;
}
int cal(int u,int val)
{
	tot=0;
	d[u]=val;
	getdep(u,0);
	sort(dep+1,dep+1+tot);
	int l=1,r=tot,ret=0;
	while(l<r)
	{
		if(dep[l]+dep[r]<=k)
		{
			ret+=r-l;
			++l;
		}
		else --r;
	}
	return ret;
}
void solve(int u)
{
	ans+=cal(u,0);
	vis[u]=true;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(vis[v])continue;
		ans-=cal(v,e[i].val);
		sum=sumch[v];
		root=0;
		getroot(v,0);
		solve(root);
	}
	return;
}
int main()
{
	scanf("%d%d",&n,&n);
	++n;
	for(int i=1;i<n;++i)
	{
		int x,y,z;
		char t;
		scanf("%d%d%d %c",&x,&y,&z,&t);
		addedge(x,y,z);
		addedge(y,x,z);
	}
	scanf("%d",&k);
	f[0]=INF;
	sum=n;
	getroot(1,0);
	solve(root);
	printf("%d\n",ans);
	return 0;
}
